package 多台;

	/*
	 * 关于多态
	 * 1.成员变量：编译看左边，执行看左边    
	 * 2.成员方法：编译看左边，执行看右边      ，看看父类有没有这个方法(没有就报错)，执行 子类的方法体
	 * 
	 * 3.为什么成员方法 和 成员变量 不一样呢？
	 	因为  成员方法重写了，成员变量没有重写
	 	结论： 子类重写的东西才会执行，否则全部执行父类的
	 * 
	 * 4.多态的使用，
	 	优点：定义一个方法，形参为父类，那么实参可以传入它的所有子类
	 	缺点：不可以通过 父类对象 调用子类特有的方法(父类里没有的方法)
	 *
	 * 5.多态转型：父类可以使用子类特有的功能
	 	向上转型  ：子类 -> 父类
	 	向下转型 ： 父类 -> 子类
 	 *
 	 * 6.多态异常   ClassCastException 类型转换异常
 	  	Animal a = new Cat(); // 1. a 现在是Cat
 	  	a = new Dog();  // 2. 这里不是转型，是直接把狗对象的地址 给a
 	  	Cat cc =  (Cat) a ;  // 3. ClassCastException a是狗，虽然也是动物的子类，但不能转成猫，不是同一个类，猫狗是并列关系
 	  	总结：并列关系的类(同为子类)，不能相互转化
 	  	
 	  	
	 */
public class 使用多态 {
	

	public static void main(String[] args) {

		Animal a1 = new Cat();
		
		// 1. 成员变量：编译看左边，执行看左边
		System.out.println(a1.age); // 40 父类的 
		
		// 2.成员方法：编译看左边，执行看右边 	// 猫吃鱼 子类重写。
		a1.eat();
		
		//4.多态的使用，定义一个方法，形参为父类，那么实参可以传入它的所有子类  方便
		Cat c1 = new Cat(); 
		useAnimal(c1);
		Dog d1 = new Dog(); 
		useAnimal(d1);
		Pig p1 = new Pig(); 
		useAnimal(p1);
		System.out.println("");
		
		System.out.println("5.多态转型");
		// 5.多态转型
		Animal a5 = new Cat(); // 向上转型  Cat -> Animal
		a5.eat(); // 编译看右边 // 猫吃鱼
		Cat c5 = (Cat) a5;
		c5.playGame(); // 向下上转型   Animal ->  Cat
		
		
		System.out.println("6.并列关系的类，不能相互转化 ClassCastException");
		//6 .并列关系的类，不能相互转化 ClassCastException
	  	Animal a6 = new Cat(); // 1. a 现在是Cat
 	  	a6 = new Dog();  // 2. 这里不是转型，是直接把狗对象的地址 给a
 	  	Cat cc6 =  (Cat) a6 ;  // 3. ClassCastException a是狗，虽然也是动物的子类，但不能转成猫，不是同一个类，猫狗是并列关系
		
	}
	
	// 4.
	public static void useAnimal(Animal a) {
		a.eat();
//		a.sleep();
	}

}
